package com.peachcastle.socket 
{
	import com.peachcastle.socket.net.TcpClient;
	import com.peachcastle.socket.protocol.Muduo;
	
	/**
	 * ...
	 * @author kevin
	 */
	public class PClient 
	{
		
		private var conn:TcpClient;
		private var protocol:Object;
		
		// Default values
		private const DEFAULT_ADDR					: String = "localhost";
		private const DEFAULT_PORT					: uint = 60000;
		private const DEFAULT_PROTOCOL				: String = "Muduo";
		private const PROTOCOLS						: Object = {
			"Muduo" : Muduo
		};
		
		// Contruct
		public function PClient(param:Object)
		{
			// You do not give me anything
			if (!param.addr)
			{
				param.addr = DEFAULT_ADDR;
			}
			
			if (!param.port)
			{
				param.port = DEFAULT_PORT;
			}
			
			if (!param.protocol)
			{
				param.protocol = DEFAULT_PROTOCOL;
			}
			
			// OK, let's go
			this.conn = new TcpClient(param.addr, param.port);
			if (param.on_connect)
			{
				this.conn.on_connect = param.on_connect;
			}
			
			if (param.on_close)
			{
				this.conn.on_close = param.on_close;
			}
			
			if (param.on_io_error)
			{
				this.conn.on_io_error = param.on_io_error;
			}
			
			if (param.on_sec_error)
			{
				this.conn.on_sec_error = param.on_sec_error;
			}
			
			if (param.on_cmd)
			{
				this.conn.on_cmd = param.on_cmd;
			}
			
			// Prefer the protocol
			if (this.PROTOCOLS[param.protocol])
			{
				this.protocol = new this.PROTOCOLS[param.protocol]();
				this.conn.on_data = this.protocol.hrecv;
			}
			
			return;
		}
		
		public function send(params:Object) : uint
		{
			var len:int;
			len = this.conn.send(this.protocol.hsend(params));
			
			return len;
		}
			
		public function socketClose():void
		{
			this.conn.socketClose();
		}	
	}

}